package tpl

import (
	"cobra_toml/util"
	"fmt"
	"github.com/hyperledger/fabric/common/flogging"
	"github.com/spf13/viper"
	"os"
	"path/filepath"
	"strings"
	"text/template"
)

var logger = flogging.MustGetLogger("template")
var CfgTplEmpty = `## powered by lcweng@travelsky.com.cn ，configData template defined at 2023.9.19 ##
[workdir]
## 这里配置多个要打开的 文件夹
list= [
    "G:\\10月后的工作\\区块链学习收集",
    "G:\\坚果\\区块链知识笔记",
    "D:\\opt\\gopath\\src\\github.com\\hyperledger\\fabric",
    "G:\\PDF",
    ]
[software]
## 这里配置要打开的 软件
list=[
    "D:\\Program Files (x86)\\iNode\\iNode Client\\iNode Client.exe",
    "E:\\Program Files (x86)\\Tencent\\WeChat\\WeChat.exe",
    ]
`

var shellTpl = `{{.About}}
{{- range $i,$s := .SoftList }}
Start-Sleep 3
& "{{$s}}"
{{end}}
{{- range $j,$d := .DirList }}
$wd{{$j}}='{{$d}}'
{{end }}

echo '正在准备你的工作环境'
{{  .RunShell -}}
echo '已经准备好'
`
var shellTplKey = "powershell_gen.toml"

// 该结构体封装了模板解析所需的数据，以及自定义解析函数（用于复杂求值）,其由配置文件 powershell_gen.toml 进行自定义
type configData struct {
	SoftList []string
	DirList  []string
}
type PsGenHandler struct {
	data           *configData
	replaceTplFile string //如果外部使用新模板，则使用外部的模板文件，这里存文件路径
}

//附加的函数用于模板解析

func (c *configData) About() string {
	return util.AboutMessageUpdatedAt()
}
func (c *configData) RunShell() string {
	var wdParam []string
	for i := 0; i < len(c.DirList); i++ {
		wdParam = append(wdParam, fmt.Sprintf("$wd%d", i))
	}
	return strings.Join(wdParam, ",") +
		" | ForEach-Object -Process {(New-Object -ComObject \"Shell.Application\").Explore($_)}"
}

func (p *PsGenHandler) Generate(outDir ...string) error {
	parse, _ := template.New(shellTplKey).Parse(shellTpl)
	out := os.Stdout //未设置输出文件夹，则直接打印到控制台
	var err error
	logger.Info("output: ", outDir)
	if outDir != nil {
		//只设置了 输出文件夹
		if len(outDir) == 1 {
			out, err = util.MustCreateFile(filepath.Join(outDir[0], "powershell_gen.ps1"))
			//输出文件夹、输出文件名 都设置
		} else if len(outDir) == 2 {
			out, err = util.MustCreateFile(filepath.Join(outDir[0], outDir[1]))
		}
	}
	if err = parse.Execute(out, p.data); err != nil {
		logger.Error(err)
		return err
	}
	logger.Info("Generate configData file successful.")
	return nil
}

func NewPsGenHandler(configFile string) *PsGenHandler {
	v := viper.New()
	v.SetConfigFile(configFile)
	err := v.ReadInConfig()
	if err != nil {
		logger.Errorf("读取配置异常【%v】", err)
		panic(err)
	}
	if v.GetStringSlice("workdir.list") == nil {
		logger.Warnf("项【workdir.list】配置读取为空")
	}
	if v.GetStringSlice("software.list") == nil {
		logger.Warnf("项【software.list】配置读取为空")
	}
	return &PsGenHandler{
		data: &configData{
			SoftList: v.GetStringSlice("software.list"),
			DirList:  v.GetStringSlice("workdir.list"),
		},
	}
}
